function add(a, b, c) {
    return a + b + c;
}

// add(1, 2)

// let addCurry = curry(add);
// addCurry(1)(2);  // 3



function curry(fn, ...args) {
    let length = fn.length;
    args = args || []
    return function () {
        let _args = args.slice(0), arg; // _args 是curry帮接受的参数
        for (let i = 0; i < arguments.length; i++) { // 返回的function帮接受了多少个参数
            arg = arguments[i];
            _args.push(arg);
        }

        // curry 接受的参数个数+第一层返回的function接受的参数个数 < 原函数接受的参数个数
        // 说明没有接受完，继续返回function
        if (_args.length < length) {
            return curry(fn, ..._args)
        } else {
            // 所有参数都接受完，返回原函数的执行结果
            return fn(..._args);
        }
    }
}

const res = curry(add);
res(1)(2)(3) // 6
res(1)(2, 3) // 6
res(1, 2)(3) // 6
console.log(res(1, 2, 3));
// 6